﻿#ifndef __CAN_PARSE_H__
#define __CAN_PARSE_H__
#include <stdint.h>

#define SIG_IVALID  0x7FFFFFFF
typedef struct {
	int speed;           /* 车速,单位: 1/128kmph/bit, 物理范围：0-500Km/h, 无效值：-1 */
	int brake;           /* 刹车状态, 0:未刹车, 1:已刹车, 无效值：-1 */
	int reverse;         /* 是否倒车， 0：未倒车， 1：倒车, 无效值：-1 */
	int left_light;      /* 左转向灯状态, 0:熄灭, 1:闪烁, 无效值：-1 */
	int right_light;     /* 右转向灯状态, 0:熄灭, 1:闪烁, 无效值：-1 */
	int steering_angle;  /* 转向角度， 正值表示向左，负值表示向右, 单位: 0.1deg，物理范围：-800deg ～ 800deg， 无效值：SIG_IVALID */
	int steering_speed;  /* 转向角速度, 单位: 1deg/s，物理范围：0~2000deg/s， 无效值：-1 */
	int ldw_on;          /* LDW开关， 0：off, 1:on, 无效值：-1 */
	int fcw_on;          /* FCW开关， 0：off, 1:on, 无效值：-1 */
	int low_beam;        /* 近光灯状态， 0：熄灭， 1：点亮, 无效值：-1 */
	int high_beam;       /* 远光灯状态， 0：熄灭， 1：点亮, 无效值：-1 */
	int front_wiper;     /* 前雨刮器工作状态， 0：不工作， 1：低档， 2：中档， 3：高档， 4：间歇档, 无效值：-1 */
	int yaw_rate;        /* 横摆角速度, 单位: 0.01deg/s, 物理范围：-360deg/s ~ 360deg/s, 无效值：SIG_IVALID */
	int standstill;      /* 车辆是否静止, 0:非静止, 1:静止, 无效值: -1 */
} signal_t;

struct car_hard_signal {
	int left_light;
	int right_light;
	int brake;
	int speed;   /* 硬线频率 * 256 */
};

struct car_hard_param {
	int left_flash_interval;
	int right_flash_interval;
};

struct signal_ctrl {
	int bitrate;
	int id_num;
	uint32_t id_tab[64];
};

typedef struct {
	const char *cfg_file;
	void (*msg_hook)(uint32_t, uint8_t*);
	void (*msg_hook_timeout)(int timeout_ms);
} car_input_param_t;

struct signal_operations {
    void (*msg_hook)(uint32_t, uint8_t*);
	void (*msg_hook_timeout)(int timeout_ms);
	int  (*get_hard_line)(struct car_hard_signal*);
	int  (*hard_line_init)(struct car_hard_param*);
	void (*hard_line_release)(void);
    int  (*can_write)(unsigned int, unsigned char*, int);	
};

int     open_signal_cfg(const char *cfgname, struct signal_operations *op);
void    close_signal_cfg(void);
void    can_parser(uint32_t id, uint8_t *dat);
struct  signal_ctrl*     get_signal_ctrl(void);
int     can_get_input(signal_t *sig);
void    can_timeout(int timeout_ms);
int     can_is_alive(void);
int     can_is_outline(void);
unsigned char  get_caninput_version(void);
 
#endif
